package org.umlviewer.xmiparser;

import java.io.FileInputStream;
import java.util.List;
import org.umlviewer.model.Constants;
import org.umlviewer.model.UmlDiagram;
import org.umlviewer.model.diagram_class.Clase;
import org.umlviewer.model.diagram_class.Attribute;
import org.umlviewer.model.diagram_class.Method;
import org.umlviewer.model.diagram_class.DiagramClass;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.Namespace;
import org.jdom2.input.SAXBuilder;
import org.jdom2.xpath.*;
import java.awt.Rectangle;
import org.umlviewer.model.VisibilityKind;

public class TestXML {

    public TestXML() {
    }
        
    
    public UmlDiagram getUmlDigram()
    {
        DiagramClass ret = new DiagramClass();
        SAXBuilder builder = new SAXBuilder();
        Document xml = null;
        try {
            xml = builder.build(new FileInputStream("pruebaEA.xml"));
            if (xml != null) {
                Element raiz = xml.getRootElement();
                List<Element> clases = (List<Element>) XPath.selectNodes(raiz, "XMI.content/UML:Model/UML:Namespace.ownedElement/UML:Package/UML:Namespace.ownedElement/UML:Class");
                System.out.println("clase " + clases.size());
                //se recorren las clases
                for (Element e : clases) {
                    System.out.println("Nombre: " + e.getAttribute("name").getValue());
                    System.out.println("ID: " + e.getAttribute("xmi.id").getValue());
                    Clase c = new Clase();
                    c.setName(e.getAttribute("name").getValue());
                    c.setId(e.getAttribute("xmi.id").getValue());
                    
                    //leyendo atributos
                    List<Element> attributos = (List<Element>)XPath.selectNodes(e, "UML:Classifier.feature/UML:Attribute");
                    for(Element a: attributos)
                    {
                        Attribute att = new Attribute(a.getAttributeValue("name"), "", VisibilityKind.V_PUBLIC);
                        c.addAttribute(att);
                    }                    
                    //leyendo operaciones
                    attributos = (List<Element>)XPath.selectNodes(e, "UML:Classifier.feature/UML:Operation");
                    for(Element a: attributos)
                    {
                        Method mt = new Method();
                        mt.setName(a.getAttribute("name").getValue());
                        c.addMethod(mt);
                    }
                    ret.addElement(c);
                }

            }
        } catch (Exception ex) {
            System.out.println("error " + ex.getLocalizedMessage());
        }
        return ret;
    }
    
    public static void main(String[] arg)
    {
        SAXBuilder builder = new SAXBuilder();
        try {
            Document xml = builder.build(new FileInputStream("pruebaEACU21.xml"));
            Element raiz = xml.getRootElement();
            System.out.println(raiz.getAttributeValue("version", Constants.XMINAMESPACE,"aa"));
            /*List<Element> hijosraiz = raiz.getChildren();
            for(Element hijo: hijosraiz){  
                // Obtenemos el nombre y su contenido de tipo texto  
                String nombre = hijo.getName();  
                String texto = hijo.getValue();  

                System.out.println("\nEtiqueta: "+nombre+". Texto: "+texto);  

                // Obtenemos el atributo id si lo hubiera  
                String id = hijo.getAttributeValue("id");  
                if(id!=null){  
                    System.out.println("\tId: "+id);  
                }  
                }  */
            //Element header = raiz.getChild("XMI.header");
            //List<Element> clases = (List<Element>)XPath.selectNodes(raiz, "XMI.content/UML:Model/UML:Namespace.ownedElement/UML:Package/UML:Namespace.ownedElement/UML:Class");
            //System.out.println("clase "+clases.size());
            //se recorren las clases
            /*for(Element e: clases)
            {
                System.out.println("Nombre: "+e.getAttribute("name").getValue());
                System.out.println("Nombre: "+e.getAttribute("xmi.id").getValue());
            }*/
            LeerRecursivo(raiz);
            
        }catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    public static void LeerRecursivo(Element raiz)
    {
        List<Element> hijos;
        hijos = raiz.getChildren();        
        String aux;
        Namespace ns = Namespace.getNamespace("xmi", "http://schema.omg.org/spec/XMI/2.1");
        /*if(hijos.isEmpty())
        {
            System.out.println("Etiqu: "+raiz.getName()+" - Val:" + raiz.getValue());                        
        }
        else
        {*/
            for(Element e: hijos)
            {                                
                if(e.getAttributeValue("type",ns, "").equals("uml:Actor"))
                    System.out.println("Etiqu: "+e.getName()+" - Val:" + e.getAttributeValue("name"));
                LeerRecursivo(e);
            }
        //}
    }
    
}
